package com.shop.config;

import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 获取配置 
 */
public class Config {
	
	 // 配置参数
	private static List<?> $config ;
	
	private static Map<String, ?> mapConfig;
	
	private static String configPath;
	
	private static Class<?> type; //配置解析驱动
	
	public static List<?> get$config() {
		return $config;
	}

	public static void set$config(List<?> $config) {
		Config.$config = $config;
	}
	
	
	 /**
     * 解析配置文件或内容
     * @param  $configPath 配置文件路径
     * @param  $type 配置解析类型
     * @param  $name 配置名（如设置即表示二级配置）
     * @return {@link List}
     */
    @SuppressWarnings("unchecked")
	public static Map<String, ?> parse(String $configPath, Class<?> $type)
    {
    	if(mapConfig != null) {
    		return mapConfig;
    	}
        try {
        	
        	configPath = $configPath;
        	
        	type = $type;
        	
        	//获取方法解析配置文件
	        Method method = $type.getMethod("parse", String.class);
			Map<String, ?> config = (Map<String, ?>)method.invoke($type.newInstance(), new Object[]{$configPath});
			mapConfig = config;
	        return config;
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
        return null;
    }
	
    /**
     * 获取当前配置组的某个键值 
     * @param key 键名
     * @return {@link Object}
     */
    public static Object getKey (String key) {
    	
    	Map<String, ?> config = parse(configPath, type);
    	
    	return config.get(key);
    	
    }
    
    /**
     * 设置配置参数 name为数组则为批量设置
     * @param string|array  $name 配置参数名（支持二级配置 .号分割）
     * @param mixed         $value 配置值
     * @param string        $range  作用域
     * @return mixed
     */
    public  void set(List<?> config, Class<?> className)
    {
       
    }

	public static Map<String, ?> getMapConfig() {
		return mapConfig;
	}

	public static void setMapConfig(Map<String, ?> mapConfig) {
		Config.mapConfig = mapConfig;
	}
    
}
